package com.bocom.hairy.crab.consumer.config;

import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.util.TimeValue;
import org.apache.hc.core5.util.Timeout;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * HttpClient 5 连接池配置（适配Spring Boot 3）
 */
@Configuration
public class HttpClientPoolConfig {

    /**
     * 创建带连接池的HttpClient实例
     */
    public HttpClient createHttpClient() {
        // 1. 连接池管理器
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(100); // 最大总连接数（根据并发量调整）
        connectionManager.setDefaultMaxPerRoute(30); // 单路由最大连接数（如同一域名）

        // 2. 连接参数配置
        ConnectionConfig connectionConfig = ConnectionConfig.custom()
                .setConnectTimeout(Timeout.ofSeconds(3))    // 连接建立超时
                .setSocketTimeout(Timeout.ofSeconds(10))    // 数据传输超时
                .setTimeToLive(TimeValue.ofMinutes(5))      // 连接存活时间：5分钟
                .build();
        connectionManager.setDefaultConnectionConfig(connectionConfig);

        // 3. 请求参数配置
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectionRequestTimeout(Timeout.ofSeconds(2)) // 从连接池获取连接超时
                .setRedirectsEnabled(true) // 允许自动重定向
                .build();

        // 4. 定期清理空闲连接（防止连接失效）
        //connectionManager.closeIdleConnections(30, TimeUnit.SECONDS); // 30秒空闲关闭
        //connectionManager.closeExpiredConnections();

        // 5. 构建HttpClient
        return HttpClients.custom()
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                .evictIdleConnections(TimeValue.ofSeconds(30)) // 定时清理任务
                .evictExpiredConnections()
                .build();
    }
}


